package github.ziwukun.jsonql.lang;

import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;

/**
 * where语句
 * @author Hugo.Yu
 */
public interface Where extends ToJSONQLable,Serializable{
	public static Where readJson(String json) {
		return WhereJson.readJson(json);
	}
	
	public static WhereBuilder builder() {
		return new WhereBuilder(null, null);
	}
	
	String key();
	Object value();
	int deep();
	
	/**key是否是属性名称*/
	boolean keyIsProp();
	/**key是否是逻辑连接符*/
	boolean keyIsLogic();
	/**key是否是and链接符*/
	boolean keyIsAnd();
	/**key是否是or链接符*/
	boolean keyIsOr();
	/**key是否是比较符*/
	boolean keyIsCmpOpr();
	
	/**比较符号*/
	CmpOpr keyAsCmpOpr();
	/**获取key为属性名称*/
	String keyAsProp();
	
	/**获取值为where类型*/
	Where valAsWhere();
	/**获取值为where类型的列表*/
	List<Where> valAsWheres();
	
	/**是否有子属性搜索条件*/
	boolean hasChildProp();
	/**子属性的搜索条件 没有返回null*/
	Where childPropWhere(String propName);
	
	/**判断是否是指定属性名的Where语句*/
	boolean isPropWhere(String propName);
	/**获取属性的Where语句<br>
	 * keyIsLogic 遍历<br>
	 * keyIsProp 判断prop是否一致<br>
	 * */
	Where propWhere(String propName);
	
	/**替换属性名称*/
	Where replaceProp(String newPropName);
	/**替换属性值*/
	Where replaceVal(Serializable val);
	
	
	
	public static Where and(List<Where> wheres) {
		return new WhereImpl(CmpOpr.AND.atWord(), new LinkedList<>(wheres));
	}
	
	public static Where or(List<Where> wheres) {
		return new WhereImpl(CmpOpr.OR.atWord(), new LinkedList<>(wheres));
	}
}
